package com.example.thread.d8CompletableFuture1.supplyAsync1;

import com.example.thread.d8CompletableFuture1.SmallTool;

import java.util.concurrent.CompletableFuture;

// 等待上一个异步任务执行完毕之后，再去执行
// 连接两个有依赖关系的任务，结果由第二个任务返回
public class _01_thenApply {
    public static void main(String[] args) {
        SmallTool.printTimeAndThread("小白吃好了");
        SmallTool.printTimeAndThread("小白 结账、要求开发票");

        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(()-> {
            SmallTool.printTimeAndThread("服务员收款 500元");
            SmallTool.sleepMillis(200);
            return "500";
        }).thenApplyAsync(money-> { // money是上一个任务的返回值  thenApply同一个线程  thenApplyAsync 不同线程
            SmallTool.printTimeAndThread(String.format("服务员开发票 面额 %s元",money));
            SmallTool.sleepMillis(100);
            return String.format("%s元发票",money);
        });

        SmallTool.printTimeAndThread("小白 接到朋友电话，想打游戏");
        SmallTool.printTimeAndThread(String.format("小白拿到%s,准备回家",cf1.join()));  // join（）等待任务执行结束，返回任务结束的结果
    }
}

//1699760436377	|	1	|	main	|	小白吃好了
//1699760436377	|	1	|	main	|	小白 结账、要求开发票
//1699760436536	|	13	|	ForkJoinPool.commonPool-worker-1	|	服务员收款 500元
//1699760436536	|	1	|	main	|	小白 接到朋友电话，想打游戏
//1699760436805	|	13	|	ForkJoinPool.commonPool-worker-1	|	服务员开发票 面额 500元
//1699760436908	|	1	|	main	|	小白拿到500元发票,准备回家

